package com.mdx.tools.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
 
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;

import org.bytedeco.javacpp.*;

public class VideoToImgUtil {
	
//	/**
//	 * 获取视频图片
//	 * @Title: gainVedioImg
//	 * @param: filePath  文件夹路径
//	 * @return: void
//	 * @throws
//	 */
//	public static void getVedioImg(String filePath, String fileName, int second) {
//		getImage(filePath, fileName, second);
//	}
//	/**
//	 * 获取视频图片
//	 * @Title: gainVedioImg
//	 * @param:
//	 * @return: void
//	 * @throws
//	 */
//	public static void getVedioImg(String filePath, String fileName) {
//		getImage(filePath, fileName, 1);
//	}
//
//	private static void getImage(String filePath, String fileName, int second) {
//		 File folder = new File(filePath);
//         if (!folder.exists())
//         {
//        	 folder.mkdirs();//如果文件夹不存在则创建
//         }
//	     try{
//            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath + File.separator + fileName);
//            grabber.start();
//            int ftp = grabber.getLengthInFrames();
//            int flag=0;
//            Frame frame = null;
//            while (flag <= ftp) {
//                //获取帧
//                frame = grabber.grabImage();
//                //过滤前 second 帧，避免出现全黑图片
//                if ((flag>second)&&(frame != null)) {
//                    break;
//                }
//                flag++;
//            }
//           String rotate = grabber.getVideoMetadata("rotate");
//           //创建BufferedImage对象
//	   	    Java2DFrameConverter converter = new Java2DFrameConverter();
//	   	    BufferedImage bufferedImage = converter.getBufferedImage(frame);
//    	    if (rotate != null) {
//    	        //旋转图片
//    	    	bufferedImage = rotate(bufferedImage, Integer.parseInt(rotate));
//    	    }
//    	    String newFileName = filePath + File.separator + fileName.substring(0, fileName.lastIndexOf("."))+".jpeg";
//            ImageIO.write(bufferedImage, "jpeg", new File(newFileName));
//            grabber.close();
//            grabber.stop();
//            System.out.println("success");
//	     }catch(Exception e){
//	    	 e.printStackTrace();
//	     }
//
//	}
//
//	private static BufferedImage rotate(BufferedImage src, int angel) {
//	    int src_width = src.getWidth(null);
//	    int src_height = src.getHeight(null);
//	    int type = src.getColorModel().getTransparency();
//	    Rectangle rect_des = calcRotatedSize(new Rectangle(new Dimension(src_width, src_height)), angel);
//	    BufferedImage bi = new BufferedImage(rect_des.width, rect_des.height, type);
//	    Graphics2D g2 = bi.createGraphics();
//	    g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
//	    g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
//	    g2.drawImage(src, 0, 0, null);
//	    g2.dispose();
//	    return bi;
//	}
//	private static Rectangle calcRotatedSize(Rectangle src, int angel) {
//	    if (angel >= 90) {
//	        if(angel / 90 % 2 == 1) {
//	            int temp = src.height;
//	            src.height = src.width;
//	            src.width = temp;
//	        }
//	        angel = angel % 90;
//	    }
//	    double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
//	    double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
//	    double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;
//	    double angel_dalta_width = Math.atan((double) src.height / src.width);
//	    double angel_dalta_height = Math.atan((double) src.width / src.height);
//	    int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha - angel_dalta_width));
//	    int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha - angel_dalta_height));
//	    int des_width = src.width + len_dalta_width * 2;
//	    int des_height = src.height + len_dalta_height * 2;
//	    return new Rectangle(new Dimension(des_width, des_height));
//	}
//
//	public static void main(String[] args) throws IOException {
//		String videoPath = "E:\\jag_dev\\test.mp4";
//		String outPath = "E:\\jag_dev\\video_img";
//		getVedioImg(videoPath, outPath,3);
//
//	}

	/**
	 * 获取指定视频的帧并保存为图片至指定目录
	 * @param videofile  源视频文件路径
	 * @param framefile  截取帧的图片存放路径
	 * @throws Exception
	 */
	public static void fetchFrame(String videofile, String framefile)
			throws Exception {
		long start = System.currentTimeMillis();
		File targetFile = new File(framefile);
		FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videofile);
		ff.start();
		int lenght = ff.getLengthInFrames();
		int i = 0;
		Frame f = null;
		while (i < lenght) {
			// 过滤前5帧，避免出现全黑的图片，依自己情况而定
			f = ff.grabFrame();
			if ((i > 500) && (f.image != null)) {
				break;
			}
			i++;
		}
		opencv_core.IplImage img = f.image;
		int owidth = img.width();
		int oheight = img.height();
		// 对截取的帧进行等比例缩放
		int width = 800;
		int height = (int) (((double) width / owidth) * oheight);
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		bi.getGraphics().drawImage(f.image.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH),
				0, 0, null);
		ImageIO.write(bi, "jpg", targetFile);
		//ff.flush();
		ff.stop();
		System.out.println(System.currentTimeMillis() - start);
	}

	public static void main(String[] args) {
		try {
			VideoToImgUtil.fetchFrame("E:\\jag_dev\\test.mp4", "E:\\jag_dev\\video_img\\test1.jpg");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}
